package com.heima.leetcode.practice;

/**
 * @author 勾新杰
 * @version 1.0
 * @description: leetcode 88. 合并两个有序数组
 * @date 2025/3/13 22:33
 */
public class E88 {

    /**
     * <h3>方法一：用双指针加起始指针</h3>
     * @param nums1 数组一
     * @param m 数组一长度（不考虑0占的位置）
     * @param nums2 数组二
     * @param n 数组二长度
     */
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        // 1. 准备临时数组存储数组一的前m长度的值
        int[] temp = new int[m];
        System.arraycopy(nums1, 0, temp, 0, m);
        // 2. 准备双指针，分别指向数组一和数组二，以及起始指针index
        int index1 = 0, index2 = 0, index = 0;
        // 3. 循环比较，将小的值放入nums1中，同时指针后移
        while (index1 < m && index2 < n) {
            if (temp[index1] < nums2[index2]) {
                nums1[index++] = temp[index1++];
            } else {
                nums1[index++] = nums2[index2++];
            }
        }
        // 4. 循环结束后，将剩余的数组二或者数组一的值放入nums1中
        if (index1 < m) {
            System.arraycopy(temp, index1, nums1, index, m - index1);
        }
        if (index2 < n) {
            System.arraycopy(nums2, index2, nums1, index, n - index2);
        }
    }
}
